# 导入计算机视觉相关库
import cv2          # OpenCV库，用于图像处理
import numpy as np  # 数值计算库，用于数组操作
import matplotlib.pyplot as plt  # 可视化库

def create_sample_image():
    """创建示例图像 - 生成用于演示的合成图像"""
    # 创建一个300x300的黑色图像 (高度x宽度x通道数)
    image = np.zeros((300, 300, 3), dtype=np.uint8)  # uint8表示0-255的像素值

    # 在图像上绘制不同形状
    # cv2.rectangle(图像, 左上角坐标, 右下角坐标, 颜色(BGR), 填充=-1)
    cv2.rectangle(image, (50, 50), (150, 150), (255, 0, 0), -1)  # 蓝色矩形
    # cv2.circle(图像, 圆心坐标, 半径, 颜色(BGR), 填充=-1)
    cv2.circle(image, (200, 100), 50, (0, 255, 0), -1)           # 绿色圆形
    # cv2.line(图像, 起点坐标, 终点坐标, 颜色(BGR), 线条粗细)
    cv2.line(image, (50, 200), (250, 250), (0, 0, 255), 5)       # 红色线条

    return image  # 返回创建的图像

def process_image():
    """图像处理示例 - 展示基本的图像处理操作"""
    # 创建示例图像用于处理
    image = create_sample_image()

    print("=== 图像处理示例 ===")
    # 显示图像基本信息
    print(f"图像形状: {image.shape}")    # (高度, 宽度, 通道数)
    print(f"数据类型: {image.dtype}")    # 像素值的数据类型
    print(f"像素值范围: {image.min()} - {image.max()}")  # 像素值的最小值和最大值

    # 转换为灰度图 - 减少计算复杂度，便于后续处理
    # cv2.cvtColor(原图像, 转换类型) - COLOR_BGR2GRAY表示BGR转灰度
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 边缘检测 - 使用Canny算法检测图像中的边缘
    # cv2.Canny(图像, 最小阈值, 最大阈值)
    edges = cv2.Canny(gray_image, 100, 200)

    # 显示处理结果信息
    print(f"\n=== 处理结果 ===")
    print(f"灰度图像形状: {gray_image.shape}")  # 灰度图只有高度和宽度
    print(f"边缘图像形状: {edges.shape}")       # 边缘图也是灰度图
    print(f"边缘像素数量: {np.count_nonzero(edges)}")  # 统计边缘像素数量

    # 简单的图像统计分析
    print(f"\n=== 图像统计 ===")
    print(f"原始图像平均亮度: {image.mean():.2f}")      # 整体平均亮度
    print(f"灰度图像平均亮度: {gray_image.mean():.2f}")  # 灰度图平均亮度
    # 计算边缘密度 (边缘像素占总像素的比例)
    print(f"边缘密度: {np.count_nonzero(edges) / (edges.shape[0] * edges.shape[1]):.4f}")

# 程序入口点
if __name__ == "__main__":
    process_image()
